/* 

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数，使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

 

示例：

输入：nums = [-1,2,1,-4], target = 1
输出：2
解释：与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
 

提示：

3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/3sum-closest
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

*/

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
// 三数之和解法
// 思想还是三数之和的思想
// 双指针基本跟while挂钩
var threeSumClosest = function (nums, target) {
    nums.sort((a, b) => a - b) // 排序
    let res = nums[0] + nums[1] + nums[2] // 三数之和 数组下标肯定>=2
    for (let i = 0; i < nums.length; i++) {
        // 双指针 写法还是三数之和的思想写法
        let left = i + 1
        let right = nums.length - 1
        while (left < right) {
            const tempNum = nums[i] + nums[left] + nums[right]
            // 判断条件
            if (Math.abs(target - tempNum) < Math.abs(target - res)) {
                res = tempNum
            }
            if (tempNum > target) {
                right--
            } else if (tempNum < target) {
                left++
            } else {
                // 相等情况
                return tempNum
            }
        }
    }
    return res
};